package data.school;

import java.io.Serializable;

/**
 * 학교데이터 클래스
 */
public class SchoolData implements Serializable
{
	/**
	 * 행정구역 사이트 목록
	 */
	public enum Area
	{
		SEN("http://hes.sen.go.kr"), // 서울
		PEN("http://hes.pen.go.kr"), // 부산
		DGE("http://hes.dge.go.kr"), // 대구
		ICE("http://hes.ice.go.kr"), // 인천
		GEN("http://hes.gen.go.kr"), // 광주
		DJE("http://hes.dje.go.kr"), // 대전
		USE("http://hes.use.go.kr"), // 울산
		SJE("http://hes.sje.go.kr"), // 세종
		GOE("http://hes.goe.go.kr"), // 경기
		KWE("http://hes.kwe.go.kr"), // 강원
		CBE("http://hes.cbe.go.kr"), // 충북
		CNE("http://hes.cne.go.kr"), // 충남
		JBE("http://hes.jbe.go.kr"), // 전북
		JNE("http://hes.jne.go.kr"), // 전남
		GBE("http://hes.gbe.kr"),    // 경북
		GNE("http://hes.gne.go.kr"), // 경남
		JJE("http://hes.jje.go.kr"); // 제주

		public final String site; // 사이트 주소

		/**
		 * 사이트 주소를 전달받는 생성자
		 * @param site : 사이트 주소
		 */
		private Area(String site)
		{
			this.site = site;
		}

		/**
		 * 사이트 주소로 행정구역을 찾는 메서드
		 * @param string : 사이트 주소
		 * @return       : 행정구역
		 */
		public static Area fromString(String string)
		{
			for (Area i : Area.values())
				if (i.site.equals(string))
					return i;

			return null;
		}
	}

	public final String insttNm;         // 학교이름
	public final String zipAdres;        // 학교주소
	public final String schulCode;       // 학교코드
	public final String schulCrseScCode; // 학교계급 (유치원 : 1, 초등학교 : 2, 중학교 : 3, 고등학교 : 4)
	public final String schulKndScCode;  // 학교종류
	public final Area   area;            // 지역사이트

	/**
	 * 학교데이터를 생성하는 메서드
	 * @param insttNm         : 학교이름
	 * @param zipAdres        : 학교주소
	 * @param schulCode       : 학교코드
	 * @param schulCrseScCode : 학교계급
	 * @param schulKndScCode  : 학교종류
	 * @param area            : 행정구역 사이트
	 * @return : 학교데이터, 잘못된 값이 전달되었을 땐 null
	 */
	public static SchoolData create(String insttNm, String zipAdres, String schulCode, String schulCrseScCode, String schulKndScCode, Area area)
	{
		SchoolData schoolData = new SchoolData(insttNm, zipAdres, schulCode, schulCrseScCode, schulKndScCode, area);
		if (schoolData.isEmpty())
			return null;
		else
			return schoolData;
	}

	/**
	 * 학교데이터에 null값이 들어가는 걸 막기 위한 private 생성자
	 * @param insttNm         : 학교이름
	 * @param zipAdres        : 학교주소
	 * @param schulCode       : 학교코드
	 * @param schulCrseScCode : 학교계급
	 * @param schulKndScCode  : 학교종류
	 * @param area            : 행정구역 사이트
	 */
	private SchoolData(String insttNm, String zipAdres, String schulCode, String schulCrseScCode, String schulKndScCode, Area area)
	{
		this.insttNm = insttNm;
		this.zipAdres = zipAdres;
		this.schulCode = schulCode;
		this.schulCrseScCode = schulCrseScCode;
		this.schulKndScCode = schulKndScCode;
		this.area = area;
	}

	/**
	 * 학교데이터가 하나라도 비어있는지 검사하는 메서드
	 * @return : 비어있으면 true, 그렇지 않으면 false
	 */
	private boolean isEmpty()
	{
		return insttNm == null ||
				zipAdres == null ||
				schulCode == null ||
				schulCrseScCode == null ||
				schulKndScCode == null ||
				area == null;
	}

	/**
	 * 비교메서드
	 * @param o : 비교대상
	 * @return : 두 클래스가 같으면 true, 다르면 false
	 */
	@Override
	public boolean equals(Object o)
	{
		SchoolData other = (SchoolData) o;
		return insttNm.equals(other.insttNm) &&
				zipAdres.equals(other.zipAdres) &&
				schulCode.equals(other.schulCode) &&
				schulCrseScCode.equals(other.schulCrseScCode) &&
				schulKndScCode.equals(other.schulKndScCode) &&
				area.equals(other.area);
	}
}